#include "stm32f10x.h"
#include "rgbled.h"
#include "delay.h"

//RGB灯管脚初始化
void RGBPinInit(void)
{
	//CIN--PB8--推挽输出
	//DIN--PB9--推挽输出
	
	RCC->APB2ENR |= 0x01<<3;//GPIOB时钟使能
	GPIOB->CRH &=~(0xFF<<0);
	GPIOB->CRH |= (0x33<<0);
    
    GPIOB->CRL &=  ~( (0x0f) << (4*0) );
    GPIOB->CRL |=  ( (1) << (4*0) );
}

//32位灰度数据组合函数
//参数说明：红绿蓝颜色值，范围都在0~255
//返回值：32位灰度值
unsigned int Make32BitColor(unsigned char red,unsigned char green,unsigned char blue)
{
	unsigned int data=0;
	//31     30     |  29    28   |  27    26   |  25    24   | 23~16 | 15~8 | 7~0 
	//两位标志位(11)+B高两位的反码+G高两位的反码+R高两位的反码+   B   +   G  +   R
	data |= 3<<30;
	data |= ((~blue)&0xC0)<<22;
	data |=	((~green)&0xC0)<<20;
	data |=	((~red)&0xC0)<<18;
	data |=blue<<16;
	data |=green<<8;
	data |=red<<0;
	
	return data;
}

//发送32位数据
void RGBSend32bitData(uint32_t data)  
{
	uint8_t i;
	for(i=0;i<32;i++)
	{
		if((data<<i)&0x80000000)
			DIN_H;
		else
			DIN_L;
		CIN_L;
		Delayus(200);
		CIN_H;
		Delayus(200);
	}

}


//颜色控制函数
//参数说明：红绿蓝颜色值，范围都在0~255
void RGBControl(unsigned char red,unsigned char green,unsigned char blue)
{
	uint32_t color=0;
	//	利用r、g、b组合成32位灰度数据
	color=Make32BitColor(red,green,blue);
	RGBSend32bitData(0);		//	发送32bit起始帧（0）
	RGBSend32bitData(color);//	发送32bit灰度数据(Color)
	RGBSend32bitData(color);//	发送32bit灰度数据

}



